package cn.edu.dgut.sai.mvc;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.SpringServletContainerInitializer;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContainerInitializer;
import javax.servlet.ServletContext;
import javax.servlet.ServletRegistration;
import java.util.Set;

/**
 * @author Sai
 * Created by Sai on 2019/9/8.
 *
 * tomcat 9.X 支持servlet 3.0的api
 * tomcat容器在启动时，会扫描所有 实现了 ServletContainerInitializer接口 的类，并回调 {@link ServletContainerInitializer#onStartup(Set, ServletContext)}方法
 * spring-mvc模块中的{@link SpringServletContainerInitializer}正是实现了{@link ServletContainerInitializer}接口
 * 同时SpringServletContainerInitializer类上有注解 {@link javax.servlet.annotation.HandlesTypes HandlesTypes} ,tomcat servlet 3.0容器会把实现了HandlesTypes的类也注入到进来
 *
 * spring-mvc正是利用servlet 3.0的这个特性，实例化spring容器--{@link AnnotationConfigWebApplicationContext}和{@link DispatcherServlet}
 *
 * 基于spring-mvc的webapp项目，可以不需要web.xml
 *
 * @see ServletContainerInitializer
 * @see SpringServletContainerInitializer
 * @see org.springframework.web.context.AbstractContextLoaderInitializer
 * @see org.springframework.web.servlet.support.AbstractDispatcherServletInitializer
 * @see org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer
 */
//@Slf4j
//public class MyWebApplicationInitializer implements WebApplicationInitializer {
//
//    @Override
//    public void onStartup(ServletContext servletCxt) {
//
//        log.info("实例化spring IoC容器，注意是 AnnotationConfigWebApplicationContext 类型");
//        // 创建spring 容器，并读取基于java的配置类，实现容器配置。
//        AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();
//        ac.register(AppConfig.class);
//        ac.refresh();
//
//        log.info("创建 DispatcherServlet 实例，并动态注册到tomcat容器(servlet 3.0的容器都可以)中");
//        // 创建 与 注册 DispatcherServlet 主控制器
//        DispatcherServlet servlet = new DispatcherServlet(ac);
//
//        // 动态注册是Servlet 3.0的一项新特性，它不需要重新加载应用程序就可以安装新的Web对象（如Servlet，过滤器，监听器等）
//        // 下面在tomcat容器中，动态注册DispatcherServlet（spring mvc的核心主控制器）
//        ServletRegistration.Dynamic registration = servletCxt.addServlet("app", servlet);
//        registration.setLoadOnStartup(1);
//        registration.addMapping("/app/*");
//    }
//}
